home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Online / NNTPd / server / list.c < prev    next >
Encoding:
C/C++ Source or Header  |  2002-11-01  |  3.5 KB  |  147 lines

  1. #ifndef lint
  2. static char    sccsid[] = "@(#)list.c    1.11    (Berkeley) 5/11/89";
  3. #endif
  4.  
  5. #include "common.h"
  6.  
  7. /*
  8.  * LIST
  9.  *
  10.  * List active newsgroups, newsgroup descriptions, distributions,
  11.  * active.times, and subscriptions.
  12.  *
  13.  */
  14.  
  15. void
  16. list(argc, argv)
  17.     int        argc;
  18.     char        *argv[];
  19. {
  20.     char        line[NNTP_STRLEN];
  21.     char        *grparray[2];
  22.     char        *filename;
  23.     char        *items;
  24.     char        *format;
  25.     register char    *cp;
  26.     register FILE    *list_fp;
  27.     char        *wildarg = NULL;
  28.     int        argc_ok = (argc == 2 || argc == 3);
  29.     
  30.     if (argc == 1 || (argc_ok && !strcasecmp(argv[1],"active"))){
  31.         if (argc == 3) {
  32.             int first, last;
  33.             int num = find_group(argv[2], &first, &last);
  34.             if (num >= 0) {
  35.                 printf("%d list:\r\n%s\r\n.\r\n",
  36.                     OK_GROUPS,group_array[num]);
  37.                 (void) fflush(stdout);
  38.                 return;
  39.             }
  40.             wildarg = argv[2];
  41.         }
  42.                 num_groups = read_groups();
  43.                 if (num_groups == 0){ /* can't get a group list */
  44.                   printf("%d Group update failed. Try later.\r\n",
  45.                          ERR_FAULT);
  46.                   (void) fflush(stdout);
  47. #ifdef LOG
  48.                   syslog(LOG_INFO, "%s group update failed in LIST", hostname);
  49. #endif
  50.                   exit(1);
  51.         }
  52.         filename = activefile;
  53.         items = "active newsgroups";
  54.         format = "Newsgroups in form \"group high low flags\".";
  55.     } else if (argc == 2 && !strcasecmp(argv[1],"distributions")){
  56.         filename = distributionsfile;
  57.         items = "newsgroup distributions";
  58.         format = "Distributions in form \"area description\".";
  59.     } else if (argc_ok && !strcasecmp(argv[1],"newsgroups")){
  60.         if (argc == 3)
  61.             wildarg = argv[2];
  62.         filename = newsgroupsfile;
  63.         items = "newsgroup descriptions";
  64.         format = "Descriptions in form \"group description\".";
  65.     } else if (argc == 2 && !strcasecmp(argv[1],"subscriptions")){
  66.         filename = subscriptionsfile;
  67.         items = "group subscription list";
  68.         format = "New-user subscription list in form \"group\".";
  69.     } else if (argc == 2 && !strcasecmp(argv[1],"overview.fmt")){
  70.         filename = overviewfmtfile;
  71.         items = "overview format";
  72.         format = "Order of fields in overview database.";
  73.     } else if (argc == 2 && !strcasecmp(argv[1],"active.times")){
  74.         filename = activetimesfile;
  75.         items = "active times";
  76.         format = "Active times in form \"group time email name\".";
  77.     } else {
  78.         printf("%d Usage: LIST [ACTIVE|NEWSGROUPS|DISTRIBUTIONS|SUBSCRIPTIONS|ACTIVE.TIMES]\r\n",
  79.             ERR_CMDSYN);
  80.         (void) fflush(stdout);
  81.         return;
  82.     }
  83.  
  84.     grparray[0] = line;
  85.     grparray[1] = NULL;
  86.  
  87.     list_fp = fopen(filename, "r");
  88.  
  89.     if (list_fp == NULL) {
  90.         printf("%d No list of %s available.\r\n", ERR_FAULT,
  91.             items);
  92.         (void) fflush(stdout);
  93. #ifdef SYSLOG
  94.         syslog(LOG_ERR, "list: fopen %s: %m", filename);
  95. #endif
  96.         return;
  97.     }
  98.  
  99.     printf("%d %s\r\n",OK_GROUPS,format);
  100.  
  101.     while (fgets(line, sizeof(line), list_fp) != NULL) {
  102.         if ((cp = index(line, '\n')) != NULL)
  103.             *cp = '\0';
  104.         for (cp = line; *cp && !isspace(*cp); cp++) ;
  105.         if (*cp)
  106.             *cp = '\0';
  107.         else
  108.             cp = NULL;
  109.         if (ngpermcount) {
  110.             if (ngmatch(s1strneql, ALLBUT,
  111.                 ngpermlist, ngpermcount,
  112.                 grparray, 1) == 0)
  113.                 continue;
  114.         }
  115.         else if (ALLBUT==0) break; /* ngpermcnt==0 && ALLBUT == 0 means
  116.                         * don't print the list, right? */
  117.         if (!wildarg || wildmat(line, wildarg)) {
  118.             if (cp)
  119.                 *cp = ' ';
  120.             putline(line);
  121.         }
  122.     }
  123.     (void) fclose(list_fp);
  124.  
  125.     putline(".");
  126.     (void) fflush(stdout);
  127. }
  128.  
  129. void
  130. xgtitle(argc, argv)
  131.     int        argc;
  132.     char        *argv[];
  133. {
  134.     char *v[3];
  135.  
  136.     if (argc != 2) {
  137.         printf("%d Usage: XGTITLE pattern\r\n", ERR_CMDSYN);
  138.         (void) fflush(stdout);
  139.         return;
  140.     }
  141.  
  142.     v[0] = "list";
  143.     v[1] = "newsgroups";
  144.     v[2] = argv[1];
  145.     list(3, v);
  146. }
  147.